package com.projekt.alpar;


import com.projekt.alpar.PlayerService.LocalBinder;

import HatterOsztalyok.Database;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class LejatszoActivity extends Activity {
	private PlayerService mService;
	private boolean mBound = false;
	private boolean stopFlag;

	/**
	 * Létrehozza az activity-t
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lejatszo);

		Button load = (Button) findViewById(R.id.load);
		load.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Database db = new Database(getApplicationContext(),
						getContentResolver(), 1);
				db.loadMusic();
			}
		});

		Button playlist = (Button) findViewById(R.id.playlist);
		playlist.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Log.i("Lejatszo", "Playlist meghivasa elott");
				Intent uj = new Intent(getApplicationContext(),
						ChooserActivity.class);
				startActivity(uj);
				Log.i("Lejatszo", "Playlist meghivasa utan");
			}

		});

		Button previous = (Button) findViewById(R.id.previous);
		previous.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				mService.previous();
			}

		});

		Button playpause = (Button) findViewById(R.id.playpause);
		playpause.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				mService.togglePlayback();
			}

		});

		Button stop = (Button) findViewById(R.id.stop);
		stop.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				mService.stop();
			}

		});

		Button next = (Button) findViewById(R.id.next);
		next.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				mService.next();
			}

		});

		SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);

		seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {				
			}

			public void onStartTrackingTouch(SeekBar seekBar) {
			}

			public void onStopTrackingTouch(SeekBar seekBar) {
				mService.seekTo(seekBar.getProgress());
				updateUI(mService.getDuration(), seekBar.getProgress());
			}
		});

		Log.i("LejatszoActivity", "Hivas elott");
		Intent intentS = new Intent(this, PlayerService.class);
		startService(intentS);
	}

	/**
	 * Amikor előtérbe kerül az activity, kapcsolodik a PlayerService-hez, és
	 * elindít egy szálat, ami majd frissíti a felületet
	 */
	@Override
	protected void onStart() {
		super.onStart();
		Intent intent = new Intent(this, PlayerService.class);
		bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
		registerReceiver(broadcastReceiver, new IntentFilter(
				PlayerService.BROADCAST_ACTION));

		final Handler mHandler = new Handler();

		stopFlag = false;
		new Thread(new Runnable() {
			TextView text = (TextView) findViewById(R.id.text5);

			Runnable mUpdateUITimerTask = new Runnable() {
				public void run() {
					text.setText(displayText);
				}
			};
			String displayText;
			public void run() {
				SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
				try {
					Log.i("LejatszoActivity", "THREAD ELINDULT");
					while (!stopFlag) {
						if (mBound == true) {
							int position = mService.getPosition();
							long duration = mService.getDuration();
							seekBar.setProgress(position);
							duration = duration / 1000;
							position = position / 1000;
							displayText = String.format("%d:%02d / %d:%02d",
									position / 60, position % 60,
									duration / 60, duration % 60);
							mHandler.post(mUpdateUITimerTask);
						}

						Thread.sleep(1000);
					}
					Log.i("LejatszoActivity", "THREAD MEGALLOTT");
				} catch (InterruptedException e) {
					e.printStackTrace();
					Log.e("LejatszoActivity",
							"Seekbar Updater thread " + e.getMessage());
				}
			}

		}).start();
	}

	/**
	 * Amikor háttérbe kerül az activity, megszakítja a kapcsolatot a
	 * PlayerService-el, és leállítja az onStart metódusban elindított szálat
	 */
	@Override
	protected void onStop() {
		super.onStop();
		stopFlag = true;
		if (mBound) {
			unbindService(mConnection);
			mBound = false;
		}
		unregisterReceiver(broadcastReceiver);
	}

	/**
	 * A kapcsolatot kezeli a PlayerService-el
	 */
	private ServiceConnection mConnection = new ServiceConnection() {

		public void onServiceConnected(ComponentName name, IBinder service) {
			Log.i("LejatszoActivity", "Binded");
			LocalBinder binder = (LocalBinder) service;
			mService = binder.getService();
			mBound = true;
			updateUI(mService.getArtist(), mService.getAlbum(),
					mService.getTitle(), mService.getTrack(),
					mService.getDuration(), mService.getPosition());
		}

		public void onServiceDisconnected(ComponentName name) {
			mBound = false;
		}
	};

	/**
	 * Fogadja az üzeneteket(amiket a PlayerService küld)
	 */
	private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			updateUI(intent);
		}
	};

	/**
	 * Frissíti a felületet az aktuálisan játszott szám adataival
	 * 
	 * @param artistN
	 *            Előadó neve
	 * @param albumN
	 *            Album neve
	 * @param titleN
	 *            Szám címe
	 * @param countN
	 *            Az albumon elfoglalt helye
	 * @param duration
	 *            Hossza
	 * @param positionN
	 *            A lejátszás pozíciója
	 */
	private void updateUI(String artistN, String albumN, String titleN,
			String countN, long duration, int positionN) {
		TextView artist = (TextView) findViewById(R.id.text1);
		TextView album = (TextView) findViewById(R.id.text2);
		TextView title = (TextView) findViewById(R.id.text3);
		TextView count = (TextView) findViewById(R.id.text4);
		SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);

		artist.setText(artistN);
		album.setText(albumN);
		title.setText(titleN);
		count.setText(countN);
		seekBar.setMax((int) duration);
		seekBar.setProgress(positionN);

		updateUI(duration, positionN);
	}

	/**
	 * Frissíti a felületet, de nem az egészet, csak a seekBar-t és az időt
	 * 
	 * @param duration
	 *            Szám hossza
	 * @param positionN
	 *            A lejátszás pozíciója
	 */
	private void updateUI(long duration, int positionN) {
		TextView position = (TextView) findViewById(R.id.text5);
		duration = duration / 1000;
		positionN = positionN / 1000;
		position.setText(String.format("%d:%02d / %d:%02d", positionN / 60,
				positionN % 60, duration / 60, duration % 60));
	}

	/**
	 * Frissíti a felületet a konkrét paraméterek helyett egy intent-et kapva
	 * paraméterként
	 * 
	 * @param intent
	 */
	private void updateUI(Intent intent) {
		updateUI(intent.getStringExtra("artist"),
				intent.getStringExtra("album"), intent.getStringExtra("title"),
				intent.getStringExtra("count"),
				intent.getLongExtra("duration", 0),
				intent.getIntExtra("position", 0));
	}
}